package plug.LinkWordsPlugin;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;

import Controller.MainController;
import Model.Exercice;

import view.Fenetre;
import view.Param;

@SuppressWarnings("serial")
public class LinkWordsPanelEtud extends JPanel implements ActionListener {

	private MainController control;
	private Exercice exo;
	private ArrayList<JRadioButton> left, right;				// liste des boutons ronds
	private ArrayList<StringPaire> choices, answers;			// listes des paires de textes
	private LinkWordsGraphicPanel pZones;						// panneau graphique des liaisons
	private JButton bEnter;										// bouton de validation
	private int indexG, indexD;									// index pour les liaisons

	public LinkWordsPanelEtud(MainController control, Exercice exo) {

		// Alignement vertical des conteneurs
		this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

		// Initialisation des variables
		this.control = control;
		this.exo = exo;
		answers = new ArrayList<StringPaire> ();
		String text = exo.getCorrection().getContenu();
		indexG = indexD = -1;

		String subText = "";
		boolean side = true; // Pour savoir si on affecte la paire de gauche ou de droite

		for (int i=0; i<text.length(); i++) {

			if (text.charAt(i) != '\n') {
				subText += text.charAt(i);
			}
			else {

				if (side) {
					answers.add(new StringPaire(subText, ""));
				}
				else {
					answers.get(answers.size()-1).setSecond(subText);
				}
				subText = "";
				side = !side;
			}

		}

		// Creation des conteneurs
		choices = new ArrayList<StringPaire> ();
		left = new ArrayList<JRadioButton> ();
		right = new ArrayList<JRadioButton> ();
		bEnter = new JButton("Valider");
		JPanel pBlock = new JPanel();
		JPanel p1 = new JPanel();
		JPanel p2 = new JPanel();

		// Ajout de la transparence
		this.setOpaque(false);
		pBlock.setOpaque(false);
		p1.setOpaque(false);
		p2.setOpaque(false);

		// Alignement vertical des elements des panneaux
		p1.setLayout(new BoxLayout(p1, BoxLayout.Y_AXIS));
		p2.setLayout(new BoxLayout(p2, BoxLayout.Y_AXIS));

		// Melange des phrases (pour eviter que chaque paire soit sur la meme ligne)
		randomizeLeft();
		randomizeRight();

		for (int i=0; i<answers.size(); i++) {

			p1.add(left.get(i));
			p2.add(right.get(i));

		}

		pZones = new LinkWordsGraphicPanel(answers.size() * 20);

		// Ajout des conteneurs
		this.add(new JLabel(exo.getEnonce().getContenu()));
		pBlock.add(p1);
		pBlock.add(pZones);
		pBlock.add(p2);
		this.add(pBlock);
		this.add(bEnter);

		// Ajout des marges
		pBlock.setBorder(Param.shortMargin);

		// Ajout des ecouteurs aux boutons
		bEnter.addActionListener(this);

	}

	public void randomizeLeft() {

		int number = 0;
		ArrayList<Integer> tab = new ArrayList<Integer> ();

		while (number<answers.size()) {

			int var = (int) (Math.random()*30)%answers.size();

			if (!tab.contains(var)) {

				JRadioButton radio = new JRadioButton(answers.get(var).getFirst());
				radio.addActionListener(this);
				left.add(radio);

				tab.add(var);
				number++;

			}

		}

	}

	public void randomizeRight() {

		int number = 0;
		ArrayList<Integer> tab = new ArrayList<Integer> ();

		while (number<answers.size()) {

			int var = (int) (Math.random()*30)%answers.size();

			if (!tab.contains(var)) {

				JRadioButton radio = new JRadioButton(answers.get(var).getSecond());
				radio.addActionListener(this);
				right.add(radio);

				tab.add(var);
				number++;

			}

		}

	}

	public void actionPerformed(ActionEvent event) {

		// MISE A JOUR DU CURSEUR A GAUCHE ET A DROITE

		for (int i=0; i<answers.size(); i++) {

			if (event.getSource() == left.get(i)) {

				indexG = i;

				for (int j=0; j<answers.size(); j++) {

					if (j != i) {
						left.get(j).setSelected(false);
					}

				}

			}
			else if (event.getSource() == right.get(i)) {

				indexD = i;

				for (int j=0; j<answers.size(); j++) {

					if (j != i) {
						right.get(j).setSelected(false);
					}

				}
			}

		}


		// REINITIALISATION DES CURSEURS ET MISE A JOUR DES LIAISONS

		if (indexG >= 0 && indexD >= 0) {

			// Variables pour retrouver le vrai index (a cause des melanges aleatoires)
			int first = -1;
			int second = -1;

			for (int i=0; i<answers.size(); i++) {
				if (left.get(indexG).getText().equals(answers.get(i).getFirst())) {
					first = i;
				}
			}

			for (int i=0; i<answers.size(); i++) {
				if (right.get(indexD).getText().equals(answers.get(i).getSecond())) {
					second = i;
				}
			}

			// Suppression des liens brises
			for (int i=0; i<answers.size(); i++) {
				StringPaire paire = new StringPaire(answers.get(first).getFirst(), answers.get(i).getSecond());
				if (paire.exist(choices)) {
					
					choices.remove(i);
					
				}
			}
			
			for (int i=0; i<answers.size(); i++) {
				StringPaire paire = new StringPaire(answers.get(i).getFirst(), answers.get(second).getSecond());
				if (paire.exist(choices)) {
					
					choices.remove(i);
					
				}
			}
			
			// Ajout d'un nouveau lien
			choices.add(new StringPaire(answers.get(first).getFirst(), answers.get(second).getSecond()));
			choices.add(new StringPaire(answers.get(second).getSecond(), answers.get(first).getFirst()));
			
			// On decoche les cases cliquees
			left.get(indexG).setSelected(false);
			right.get(indexD).setSelected(false);

			// Mise a jour du panel graphique
			pZones.erase(indexG, indexD);
			pZones.draw(indexG, indexD);

			repaint();

			indexG = indexD = -1;

		}


		// VALIDATION DE L'EXERCICE QUAND TERMINE

		if (event.getSource() == bEnter) {
			
			bEnter.setEnabled(false);

			int points = 0;

			for (int i=0; i<choices.size(); i++) {

				StringPaire paire = choices.get(i);

				if (paire.exist(answers)) {

					points++;

				}

			}
			
			points /= 2; // On divise les points par deux pour ne pas compter deux fois la meme reponse

			String text = String.valueOf(points) + " / " + String.valueOf(answers.size());

			JLabel lScore = new JLabel(text);
			this.add(lScore);

			Fenetre.fen.validate();

		}

	}

}
